// 数组尾部创建一个元素
export const createOne = (arr, item) => {
  return arr.concat(item)
}
// 数组指定位置插入一个新元素
export const createOneFromIndex = (arr, item, index) => {
  let _arrCopy = Object.assign(arr)
  _arrCopy.splice(index + 1, 0, item)
  return _arrCopy
}
// 删除数组中的指定项
export const removeOne = (arr, index) => {
  return arr.filter((el, i) => i !== index)
}
// 修改数组中的指定项
export const modifyOne = (arr, item, index) => {
  arr[index] = item
  return arr
}
// 数组中两元素更换位置
export const exChangePosition = (arr, from, to) => {
  let _arrCopy = Object.assign(arr)
  const _fromItem = _arrCopy[from]
  const _toItem = _arrCopy[to]
  _arrCopy[from] = _toItem
  _arrCopy[to] = _fromItem
  return _arrCopy
}
// 获取不重复的字段名
export const getUnRepeatRow = (arr, field, start, index = 1) => {
  const strTrimAll = (str) => {
    return str ? str.replace(/\ /g, '') : str
  }
  const newRow = {
    [field]: start + index
  }
  if (arr.some(el => strTrimAll(el[field]) === strTrimAll(newRow[field]))) {
    return getUnRepeatRow(arr, field, start, index + 1)
  } else {
    return newRow
  }
}

// 深拷贝对象
export function deepClone(value) {
  // 判断是否是基本数据类型
  function isPrimitive(value) {
    return (typeof value === 'string' ||
      typeof value === 'number' ||
      typeof value === 'symbol' ||
      typeof value === 'boolean')
  }
  // 判断是否对象
  function isObject(value) {
    return Object.prototype.toString.call(value) === "[object Object]"
  }
  // 记录被拷贝的值，避免循环引用的出现
  let memo = {};

  function baseClone(value) {
    let res;
    // 如果是基本数据类型，则直接返回
    if (isPrimitive(value)) {
      return value;
      // 如果是引用数据类型，我们浅拷贝一个新值来代替原来的值
    } else if (Array.isArray(value)) {
      res = [...value];
    } else if (isObject(value)) {
      res = { ...value };
    }
    // 检测我们浅拷贝的这个对象的属性值有没有是引用数据类型。如果是，则递归拷贝
    Reflect.ownKeys(res).forEach(key => {
      if (typeof res[key] === "object" && res[key] !== null) {
        //此处我们用memo来记录已经被拷贝过的引用地址。以此来解决循环引用的问题
        if (memo[res[key]]) {
          res[key] = memo[res[key]];
        } else {
          memo[res[key]] = res[key];
          res[key] = baseClone(res[key])
        }
      }
    })
    return res;
  }

  return baseClone(value)
}

